﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson18 : MonoBehaviour
{
    // Start is called before the first frame update
    private Texture tex;
    private Texture tex2;
    void Start()
    {
        #region 知识点一 Resources异步加载是什么?
        //上节课学习的同步加载中
        //如果我们加载过大的资源可能会造成程序卡顿
        //卡顿的原因就是从硬盘上把数据读取到内存中是需要进行计算的
        //越大的资源耗时越长，就会造成掉帧卡顿

        //Resources异步加载就是内部新开一个线程进行资源加载不会造成主线程卡顿
        #endregion

        #region 知识点二 Resource异步加载方法
        //注意:
        //异步加载不能马上得到加载的资源至少要等—帧

        //1.通过异步加载中的完成事件监听使用加载的资源
        //Unity在内部，会开启一个线程进行资源的加载
        //加载资源只能回调函数中使用
        ResourceRequest rq = Resources.LoadAsync<Texture>("Tex/001");
        //加载完成后，触发事件函数
        rq.completed += ((AsyncOperation rs) =>
        {
            Debug.LogFormat("异步-加载完成...");
            tex = (rs as ResourceRequest).asset as Texture;
            Debug.LogFormat("异步-当前帧:{0}", Time.frameCount);
        });
        Debug.LogFormat("异步-当前帧:{0}", Time.frameCount);

        //2.通过协程使用加载的资源
        StartCoroutine(Load());
        #endregion

        #region 总结
        //1完成事件监听异步加载
        //好处:写法简单
        //坏处:只能在资源加载结束后进行处理
        //“线性加载”

        //2.协程异步加载
        //好处:可以在协程中处理复杂逻辑，比如同时加载多个资源，比如进度条更新
        //坏处:写法稍麻烦
        //“并行加载”

        //注意:
        //理解为什么异步加载不能马上加载结束，为什么至少要等1帧
        //理解协程异步加载的原理
        #endregion
    }

    IEnumerator Load()
    {
        Debug.LogFormat("协程-当前帧:{0}", Time.frameCount);
        ResourceRequest rq = Resources.LoadAsync<Texture>("Tex/bk");
        //第一部分：Unity知道 该返回值 意味着你的异步加载资源
        yield return rq;
        Debug.LogFormat("协程-加载完成:{0}", Time.frameCount);
        //第二部分：Unity会自己判断 该资源是否加载完毕了 加载完毕过后 才会继续执行后面的代码
        ////方法一：
        //tex2 = rq.asset as Texture;
        //Debug.LogFormat("协程-当前帧:{0}", Time.frameCount);
        //方法二：
        while (!rq.isDone)
        {
            //打印当前的 加载进度
            //该进度不会特别准确,过渡也不是特别明显
            Debug.LogFormat("协程-当前进度:{0}",rq.priority);
            yield return null;
        }
        tex2 = rq.asset as Texture;
        Debug.LogFormat("协程-当前帧:{0}", Time.frameCount);
    }

    // Update is called once per frame
    void OnGUI()
    {
        if (tex)
        {
            GUI.DrawTexture(new Rect(0, 0, 100, 100), tex);
        }
        if (tex2)
        {
            GUI.DrawTexture(new Rect(100, 0, 100, 100), tex2);
        }
    }
}
